package com.yantong.mq;

import com.aliyun.openservices.ons.api.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import javax.annotation.PostConstruct;
import java.util.Date;
import java.util.Properties;

//@Service
public class OrderMQProducer {

	@Value("${GROUP_ID}")
	private String GROUP_ID ;
	@Value("${AccessKey}")
	private String AccessKey ;
	@Value("${SecretKey}")
	private String SecretKey ;
	@Value("${NAMESRV_ADDR}")
	private String NAMESRV_ADDR ;
	private static Properties properties;
	
	private static Producer producer;
	
    private static final Logger logger = LoggerFactory.getLogger(OrderMQProducer.class);
	 
	@PostConstruct
    public void init(){
		logger.info("===================初始化MQ========消息发布者===========");
		properties = new Properties();
		properties.put(PropertyKeyConst.GROUP_ID, GROUP_ID);
		// AccessKey 阿里云身份验证，在阿里云服务器管理控制台创建
		properties.put(PropertyKeyConst.AccessKey, AccessKey);
		// SecretKey 阿里云身份验证，在阿里云服务器管理控制台创建
		properties.put(PropertyKeyConst.SecretKey, SecretKey);
		// 设置 TCP 接入域名，到控制台的实例基本信息中查看
		//properties.put(PropertyKeyConst.NAMESRV_ADDR, "http://MQ_INST_1981846660346435_BahrcWQU.mq-internet-access.mq-internet.aliyuncs.com:80");
		properties.put(PropertyKeyConst.NAMESRV_ADDR,NAMESRV_ADDR);
		// 设置发送超时时间，单位毫秒
		properties.setProperty(PropertyKeyConst.SendMsgTimeoutMillis, "3000");
	    producer = ONSFactory.createProducer(properties);
	    producer.start();
	    
        logger.info("====================消息发布者启动成功！==================");

    }
	
   /**
    * 
    * @param content 消息内容
    * @param TOPIC_KEY 主题KEY
    * @param TAG 标签
    * @param KEY 
    */
    public static boolean sendMQMsg(String content,String TOPIC_KEY,String TAG,String KEY){
    	if(!producer.isStarted()){
			producer.start();
		}
    	Message msg = new Message( //
				// Message 所属的 Topic创建订单消息
    			TOPIC_KEY,
    			
				// Message Tag 可理解为 Gmail 中的标签，对消息进行再归类，方便 Consumer 指定过滤条件在
				// MQ 服务器过滤
				TAG,
				
				// Message Body 可以是任何二进制形式的数据， MQ 不做任何干预，
				// 需要 Producer 与 Consumer 协商好一致的序列化和反序列化方式
				content.getBytes());
    	
				// 设置代表消息的业务关键属性，请尽可能全局唯一。
				// 以方便您在无法正常收到消息情况下，可通过阿里云服务器管理控制台查询消息并补发
				// 注意：不设置也不会影响消息正常收发
				msg.setKey(KEY);

		try {
			SendResult sendResult = producer.send(msg);
			// 同步发送消息，只要不抛异常就是成功
			if (sendResult != null) {
				logger.info(new Date() + " Send mq message success. Topic is:" + msg.getTopic()
				+ " msgId is: " + sendResult.getMessageId()+"   MSG  :"+content);

			}
		} catch (Exception e) {
			// 消息发送失败，需要进行重试处理，可重新发送这条消息或持久化这条数据进行补偿处理
			logger.error(new Date() + " ----------------Send mq message failed. Topic is:" + msg.getTopic()+"   MSG  :"+content);

			e.printStackTrace();
			return false;
		}
		return true;
    }
	/**
	 *
	 * @param content 异步发送消息内容
	 * @param TOPIC_KEY 主题KEY
	 * @param TAG 标签
	 * @param KEY
	 */
	public static void sendAsync(String content,String TOPIC_KEY,String TAG,String KEY){
		if(!producer.isStarted()){
			producer.start();
		}
		Message msg = new Message(
				// Message 所属的 Topic
				TOPIC_KEY,
				// Message Tag,可理解为 Gmail 中的标签，对消息进行再归类，方便 Consumer 指定过滤条件在消息队列 RocketMQ 的服务器过滤
				TAG,
				// Message Body，任何二进制形式的数据，消息队列 RocketMQ 不做任何干预，需要 Producer 与 Consumer 协商好一致的序列化和反序列化方式
				content.getBytes());
		// 设置代表消息的业务关键属性，请尽可能全局唯一。 以方便您在无法正常收到消息情况下，可通过控制台查询消息并补发。
		// 注意：不设置也不会影响消息正常收发
		msg.setKey(KEY);
		// 异步发送消息, 发送结果通过 callback 返回给客户端。
		producer.sendAsync(msg, new SendCallback() {
			@Override
			public void onSuccess(final SendResult sendResult) {
				// 消费发送成功
				logger.info("send message success. topic=" + sendResult.getTopic() + ", msgId=" + sendResult.getMessageId());
			}
			@Override
			public void onException(OnExceptionContext context) {
				// 消息发送失败，需要进行重试处理，可重新发送这条消息或持久化这条数据进行补偿处理
				logger.error("------------------send message failed. topic=" + context.getTopic() + ", msgId=" + context.getMessageId());
			}
		});
		// 在 callback 返回之前即可取得 msgId。
		logger.info("send message async. topic=" + msg.getTopic() + ", msgId=" + msg.getMsgID());
	}
 
     
	 
/*	 private static String getSn(String prefix) {
	        Random random = new Random();
	        String nx = DateUtils.format(new Date(), "yyyyMMddHHmmssSSS");
	        return prefix.concat(nx).concat(String.valueOf(random.nextInt(1000)));
	    }*/
	
	
/*	public static void main(String[] args) {
		// 在发送消息前，必须调用 start 方法来启动 Producer，只需调用一次即可
		if(!producer.isStarted()){
			producer.start();
		}
		// 循环发送消息
		for (int i = 0; i < 10; i++) {
		String ORDER = getSn("D");
		TestOrder order = new TestOrder();
		order.setOrderNo(ORDER);
		order.setName(getName());
		order.setMobile("1527475630"+i);
		order.setAddress("收货地址"+i);
		order.setRemark("Rockect MQ "+ORDER);
		order.setGroupid("GID_CREATE_ORDER");
		order.setTopic("TOPIC_CREATE_ORDER");
		order.setTag("CREATE_ORDER");
		String	result = JSONObject.toJSONString(order);
			Message msg = new Message( //
					// Message 所属的 Topic创建订单消息
					"TOPIC_CREATE_ORDER",
					// Message Tag 可理解为 Gmail 中的标签，对消息进行再归类，方便 Consumer 指定过滤条件在
					// MQ 服务器过滤
					"CREATE_ORDER",
					// Message Body 可以是任何二进制形式的数据， MQ 不做任何干预，
					// 需要 Producer 与 Consumer 协商好一致的序列化和反序列化方式
					result.getBytes());
			// 设置代表消息的业务关键属性，请尽可能全局唯一。
			// 以方便您在无法正常收到消息情况下，可通过阿里云服务器管理控制台查询消息并补发
			// 注意：不设置也不会影响消息正常收发
			msg.setKey("CREATE_ORDER");

			try {
				SendResult sendResult = producer.send(msg);
				// 同步发送消息，只要不抛异常就是成功
				if (sendResult != null) {
					System.out.println(new Date() + " Send mq message success. Topic is:" + msg.getTopic()
							+ " msgId is: " + sendResult.getMessageId());
				}
			} catch (Exception e) {
				// 消息发送失败，需要进行重试处理，可重新发送这条消息或持久化这条数据进行补偿处理
				System.out.println(new Date() + " Send mq message failed. Topic is:" + msg.getTopic());
				e.printStackTrace();
			}
		}

		// 在应用退出前，销毁 Producer 对象
		// 注意：如果不销毁也没有问题
		producer.shutdown(); 
	}
	
	
	public static String getName() {
        Random random = new Random();
        String[] Surname = {"赵", "钱", "孙", "李", "周", "吴", "郑", "王", "冯", "陈", "褚", "卫", "蒋", "沈", "韩", "杨", "朱", "秦", "尤", "许",
                "何", "吕", "施", "张", "孔", "曹", "严", "华", "金", "魏", "陶", "姜", "戚", "谢", "邹", "喻", "柏", "水", "窦", "章", "云", "苏", "潘", "葛", "奚", "范", "彭", "郎",
                "鲁", "韦", "昌", "马", "苗", "凤", "花", "方", "俞", "任", "袁", "柳", "酆", "鲍", "史", "唐", "费", "廉", "岑", "薛", "雷", "贺", "倪", "汤", "滕", "殷",
                "罗", "毕", "郝", "邬", "安", "常", "乐", "于", "时", "傅", "皮", "卞", "齐", "康", "伍", "余", "元", "卜", "顾", "孟", "平", "黄", "和",
                "穆", "萧", "尹", "姚", "邵", "湛", "汪", "祁", "毛", "禹", "狄", "米", "贝", "明", "臧", "计", "伏", "成", "戴", "谈", "宋", "茅", "庞", "熊", "纪", "舒",
                "屈", "项", "祝", "董", "梁", "杜", "阮", "蓝", "闵", "席", "季"};
        String girl = "秀娟英华慧巧美娜静淑惠珠翠雅芝玉萍红娥玲芬芳燕彩春菊兰凤洁梅琳素云莲真环雪荣爱妹霞香月莺媛艳瑞凡佳嘉琼勤珍贞莉桂娣叶璧璐娅琦晶妍茜秋珊莎锦黛青倩婷姣婉娴瑾颖露瑶怡婵雁蓓纨仪荷丹蓉眉君琴蕊薇菁梦岚苑婕馨瑗琰韵融园艺咏卿聪澜纯毓悦昭冰爽琬茗羽希宁欣飘育滢馥筠柔竹霭凝晓欢霄枫芸菲寒伊亚宜可姬舒影荔枝思丽 ";
        String boy = "伟刚勇毅俊峰强军平保东文辉力明永健世广志义兴良海山仁波宁贵福生龙元全国胜学祥才发武新利清飞彬富顺信子杰涛昌成康星光天达安岩中茂进林有坚和彪博诚先敬震振壮会思群豪心邦承乐绍功松善厚庆磊民友裕河哲江超浩亮政谦亨奇固之轮翰朗伯宏言若鸣朋斌梁栋维启克伦翔旭鹏泽晨辰士以建家致树炎德行时泰盛雄琛钧冠策腾楠榕风航弘";
        int index = random.nextInt(Surname.length - 1);
        String name = Surname[index]; //获得一个随机的姓氏
        int i = random.nextInt(3);//可以根据这个数设置产生的男女比例
        if(i==2){
            int j = random.nextInt(girl.length()-2);
            if (j % 2 == 0) {
                name = name + girl.substring(j, j + 2);
            } else {
                name = name + girl.substring(j, j + 1);
            }

        }
        else{
            int j = random.nextInt(girl.length()-2);
            if (j % 2 == 0) {
                name = name + boy.substring(j, j + 2);
            } else {
                name = name + boy.substring(j, j + 1);
            }

        }

        return name;
    } */
}
